package com.tiankun.eurekausermsg.controller;

import com.tiankun.eurekausermsg.exception.BusinessException;
import com.tiankun.eurekausermsg.util.JsonResult;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Map;
import java.util.UUID;

/**
 * @program: Spring_myBatis
 * @description: 上传
 * @author: Tirion
 * @create: 2020-09-17 15:19
 **/
@RestController  //@RestController相当于@Controller+@ResponseBody
@RequestMapping("/upload")
public class UploadController {


    @RequestMapping(value = "/upload",method = RequestMethod.POST)
    // 通过MultipartFile对象接收前端传递的图像数据,基于layui只能用file获取目标参数名(默认,不能修改)

    //HttpServletRequest为了获取Context,从而获取"/"真实路径
    @GetMapping(value = "/upload")
    public Map<String, Object> upload(@RequestParam("file") MultipartFile multipartFile, HttpServletRequest request) throws IOException {

        //不能上传空文件

        if (multipartFile.isEmpty()) {
            throw new BusinessException("文件不能为空");
        }

        // 首先先用getSize()获取文件大小
        // 首先先将.getSize()获取的Long转为String 然后将String转为Float并除以1024 （因为1KB=1024B）
        Float size = Float.parseFloat(String.valueOf(multipartFile.getSize())) / 1024;

        System.out.println("图片的大小为：" + size);
        BigDecimal b = new BigDecimal(size);
        // 2表示2位 ROUND_HALF_UP表明四舍五入，
        size = b.setScale(2, BigDecimal.ROUND_HALF_UP).floatValue();
        // 此时size就是保留两位小数的浮点数
//        long size = multipartFile.getSize();
        if (size > 1048576) {
            throw new BusinessException("图片大小不能超过1M");
        }

        String originalFilename = multipartFile.getOriginalFilename();
        System.out.println("originalFilename:" + originalFilename);

        /*
        从原始文件名中获取后缀，后缀必须是 png /jpg /jpeg /gif
        作为新添加的文件的文件名后缀(匹配)
         */
        String subfix = originalFilename.substring(originalFilename.indexOf(".") + 1);
        System.out.println("subfix:" + subfix); //输出文件后缀
        if (!(subfix.equals("png") || subfix.equals("jpg") || subfix.equals("jpeg") || subfix.equals("gif"))) {
            throw new BusinessException("只能上传png，jpg，jpeg，gif格式的图片");
        }

        //在springboot中，然后把上传的文件保存在指定的位置

        //在目标文件中与真实路径中做一个映射

        //使用UUID作为文件名,保证服务器中存放的文件名唯一
        String targetFile = UUID.randomUUID().toString().replace("-", "") + "." + subfix;
        System.out.println("targetFile:" + targetFile); //输出目标文件名
        // 通过request获取当前程序的根路径"/"
        String path = request.getServletContext().getRealPath("/");

//        上传windows本地文件夹
        String fileName = "D:\\img\\" + targetFile;

        System.out.println("fileName:" + fileName);  //输出文件完整地址

        // 构建文件对象
        File uploadFile = new File(fileName);
        //核心操作(含有异常操作, 利用异常设定状态码(和前端约定)
        // 此处应当和ExceptionController结合, 当try执行成功则设定状态码0
        // 出现异常则设定其他
        // 再将异常信息结合BusinessException抛出, 交给ExceptionController处理
        try {
            multipartFile.transferTo(uploadFile);
        } catch (IOException e) {
            //e.printStackTrace();
            throw e;
        }

        JsonResult jsonResult = new JsonResult();

        // 返回状态:0 表示上传成功
        jsonResult.setCode("200");
        // 返回服务器保存后的文件名
        jsonResult.put("fileName", targetFile);
        jsonResult.setData(fileName);
        return jsonResult.getValues();


        //上传到Linux 服务器
//        String fileName ="/usr/upload/img/" + targetFile;
//        System.out.println("fileName:" + fileName);  //输出文件完整地址
//
////         构建文件对象
//        File uploadFile = new File(fileName);
////        核心操作(含有异常操作, 利用异常设定状态码(和前端约定)
////         此处应当和ExceptionController结合, 当try执行成功则设定状态码0
////         出现异常则设定其他
////         再将异常信息结合BusinessException抛出, 交给ExceptionController处理
//        try {
//            multipartFile.transferTo(uploadFile);
//        } catch (IOException e) {
//            //e.printStackTrace();
//            throw e;
//        }
//        JsonResult jsonResult = new JsonResult();
//        String newFilename = "/img/" + targetFile;
//        // 返回状态:200 表示上传成功
//        jsonResult.setCode("200");
//        // 返回服务器保存后的文件名
//        jsonResult.put("fileName", newFilename);
//        return jsonResult.getValues();
    }
}


